package com.jbp.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jbp.dao.EquipBagDao;
import com.jbp.exception.RRException;
import com.jbp.model.*;
import com.jbp.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.jbp.utils.PageUtils;
import com.jbp.utils.Query;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

/**
 * (EquipBag)表服务实现类
 * @author cc
 * @since 2020-10-13 17:35:59
 */
@Service
public class EquipBagServiceImpl extends ServiceImpl<EquipBagDao, EquipBag> implements EquipBagService {
    @Autowired
    private EquipService equipService;
    @Autowired
    private WalletService walletService;
    @Autowired
    private WalletRecordService walletRecordService;
    @Autowired
    private EquipUserService equipUserService;

    @Autowired
    private RankProportionService rankProportionService;

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        QueryWrapper<EquipBag> queryWrapper = new QueryWrapper<>();
        if (params.get("id") != null){
            queryWrapper.like("id",params.get("id"));
        }
        IPage<EquipBag> page = this.page(
                new Query<EquipBag>().getPage(params),
                queryWrapper
        );

        return new PageUtils(page);
    }

    @Override
    public List<Equip> equipList(String type, Integer userId) {
        List<Equip> bags = getBaseMapper().equipList(type, userId);
        return bags;
    }

    @Override
    @Transactional
    public void buyEquip(Integer equipId, Integer userId) {
        //是否存在
        if (equipId==null) {
            throw new RRException("装扮id不能为空");
        }

        Equip equip = equipService.getById(equipId);
        if (equip==null || !"usr".equals(equip.getRole())) {
            throw new RRException("装扮不存在");
        }

        //是否有效
        if ("del".equals(equip.getStatus())) {
            throw new RRException("已下架");
        }

        //是否活动商品
        if (equip.getEvent()==1) {
            throw new RRException("活动商品");
        }

        //余额
        Wallet wallet = walletService.getByUserId(userId);

        //是否免费
        if (equip.getFree()==0) {
            if (wallet.getXinzuan().compareTo(equip.getPrice())<0) {
                throw new RRException("余额不足");
            } else {
                //扣钱
                BigDecimal afterBalance = wallet.getXinzuan().subtract(equip.getPrice());

                //自己添加钱包变动记录
                WalletRecord walletRecordMe = new WalletRecord();
                walletRecordMe.setOperationType("buy_equip");
                walletRecordMe.setCoinType("xinzuan");
                walletRecordMe.setAddType("sub");
                walletRecordMe.setBeforeBalance(wallet.getXinzuan());
                walletRecordMe.setChangeBalance(equip.getPrice());
                walletRecordMe.setAfterBalance(afterBalance);
                walletRecordMe.setUserId(userId);
                walletRecordService.save(walletRecordMe);

                //百万奖池金额处理
                rankProportionService.addPrizePoolAmount(walletRecordMe.getChangeBalance());

                //自己扣钱
                wallet.setXinzuan(afterBalance);
                walletService.updateWithLock(wallet);
            }
        }

        EquipBag equipBag = getOne(new QueryWrapper<EquipBag>()
                .eq("equip_id", equipId)
                .eq("user_id", userId)
        );

        //是否购买过
        if (equipBag==null) {
            equipBag = new EquipBag();
            equipBag.setUserId(userId);
            equipBag.setType(equip.getType());
            equipBag.setEquipId(equipId);
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, equip.getDuration());
            equipBag.setOverTime(calendar.getTime());
            save(equipBag);
        } else {
            //是否过期，没过期就顺延, 过期则从当前时间开始计算
            Calendar calendar = Calendar.getInstance();
            if (equipBag.getOverTime().compareTo(calendar.getTime())>0) {
                calendar.setTime(equipBag.getOverTime());
            }

            calendar.add(Calendar.DATE, equip.getDuration());
            equipBag.setOverTime(calendar.getTime());
            updateById(equipBag);
        }
    }

    @Override
    public void setEquip(Integer equipId, Integer userId) {
        QueryWrapper<EquipBag> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("equip_id", equipId);
        queryWrapper.eq("user_id", userId);
        queryWrapper.gt("over_time", new Date());
        EquipBag one = getOne(queryWrapper);
        if (one==null) {
            throw new RRException("请先购买");
        }

        Equip equip = equipService.getById(equipId);
        EquipUser equipUser = equipUserService.getByUser(equip.getType(), userId);
        if (equipUser!=null) {
            equipUser.setEquipId(equipId);
            equipUser.setUpdateTime(new Date());
            equipUserService.updateById(equipUser);
        } else {
            equipUser = new EquipUser();
            equipUser.setType(equip.getType());
            equipUser.setEquipId(equipId);
            equipUser.setUserId(userId);
            equipUserService.save(equipUser);
        }
    }
}
